/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package quanlinganhang.dao;

import java.sql.CallableStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.DefaultTableModel;
import quanlinganhang.dto.UserDTO;

/**
 *
 * @author phamduong
 */
public class UserDAO {

    /**
     * Lấy danh sách toàn bộ User
     *
     * @return
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public static DefaultTableModel getAllUsers2()
            throws SQLException, ClassNotFoundException {
        return SqlDAOHelper.ExecuteQueryReturnTable("DsUser", null);
    }

    public static ArrayList getAllUsers() throws ClassNotFoundException, SQLException {
        return SqlDAOHelper.ExecuteQuery("DsUser", null);
    }

    /**
     * Xóa người dùng
     *
     * @param id Mã người dùng cần xóa
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static boolean DeleteUser(long id) throws ClassNotFoundException, SQLException {
        List<Parameter> sqlParams = new ArrayList<>();
        sqlParams.add(new Parameter("ID", id));
        return (SqlDAOHelper.ExecuteNonQuery("DeleteUsers", sqlParams) > 0);
    }

    /**
     * Cập nhật thông tin người dùng
     *
     * @param user Đối tượng người dùng muốn cập nhật
     * @return True thành không False thất bại
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static boolean UpdateUser(UserDTO user) throws ClassNotFoundException, SQLException {
        List<Parameter> sqlParams = new ArrayList<>();
        sqlParams.add(new Parameter("Username", user.getUsername()));
        sqlParams.add(new Parameter("Password", user.getPassword()));
        sqlParams.add(new Parameter("IsAdmin", user.isIsAdmin()));

        return (SqlDAOHelper.ExecuteNonQuery("UpdateUsers", sqlParams) > 0);
    }

    /**
     * Thêm người dùng mới
     *
     * @param user Đối tượng người dùng thêm mới
     * @return True thành không False thất bại
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static boolean AddUser(UserDTO user) throws ClassNotFoundException, SQLException {
        List<Parameter> sqlParams = new ArrayList<>();
        sqlParams.add(new Parameter("ID", user.getId()));
        sqlParams.add(new Parameter("Username", user.getUsername()));
        sqlParams.add(new Parameter("Password", user.getPassword()));
        sqlParams.add(new Parameter("IsAdmin", user.isIsAdmin()));

        return (SqlDAOHelper.ExecuteNonQuery("Insert_User", sqlParams) > 0);
    }

    /**
     * Kiểm tra xem người dùng có tồn tại hay không khi đăng nhập
     *
     * @param name Tên người dùng kiểm tra
     * @param password Mật khẩu
     * @return True có tồn tại False không tồn tại
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static boolean CheckUserExist(String name, String password) throws ClassNotFoundException, SQLException {
        SqlDAOHelper.OpenConnection();
        CallableStatement cs = SqlDAOHelper.connection.prepareCall("{call Test_Login (?,?,?)}");
        cs.setObject("Username", name);
        cs.setObject("Password", password);
        cs.registerOutParameter("Test", java.sql.Types.BOOLEAN);
        cs.executeUpdate();
        boolean check = cs.getBoolean("Test");
        SqlDAOHelper.CloseConnection();
        return check;
    }

    /**
     * Kiểm tra xem người dùng có là Admin hay không?
     *
     * @param username Tên người dùng cần kiểm tra
     * @return True là admin False không là admin
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static boolean IsAdmin(String username) throws ClassNotFoundException, SQLException {
        SqlDAOHelper.OpenConnection();
        CallableStatement cs = SqlDAOHelper.connection.prepareCall("{call Test_Admin (?,?)}");
        cs.setObject("Username", username);
        cs.registerOutParameter("IsAdmin", java.sql.Types.BOOLEAN);
        cs.executeUpdate();
        boolean check = cs.getBoolean("IsAdmin");
        SqlDAOHelper.CloseConnection();
        return check;
    }
    /**
     * Lấy Id của người dùng qua tên đăng nhập
     * @param username Tên đăng nhập của người dùng
     * @return Id của người dùng có tên đăng nhập nhập vào
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    public static long GetUserID(String username) throws ClassNotFoundException, SQLException
    {
        SqlDAOHelper.OpenConnection();
        List<Parameter> sqlParams = new ArrayList<>();
        sqlParams.add(new Parameter("username", username));
        ArrayList arr = SqlDAOHelper.ExecuteQuery("GetUserID", sqlParams);
        Object[] temp = arr.toArray();
        String t = temp[0].toString();
        t = t.substring(1);
        t = t.replace("]", "");
        return Long.parseLong(t);
    }

    /**
     * Kiểm tra xem tên người dùng đã tồn tại hay chưa?
     *
     * @param user Đối tượng người dùng muốn kiểm tra
     * @return True đã tồn tại tên này False chưa tồn tại tên này
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static boolean CheckUsernameExist(UserDTO user) throws ClassNotFoundException, SQLException {
        SqlDAOHelper.OpenConnection();
        CallableStatement cs = SqlDAOHelper.connection.prepareCall("{call Test_Username (?,?)}");
        cs.setObject("Username", user.getUsername());
        cs.registerOutParameter("Test", java.sql.Types.BOOLEAN);
        cs.executeUpdate();
        boolean check = cs.getBoolean("Test");
        SqlDAOHelper.CloseConnection();
        return check;
    }
}
